package org.fkjava.common.dao.impl;

import org.apache.commons.lang.StringUtils;
import org.fkjava.common.dao.GeneratorDao;
import org.fkjava.oa.util.OaException;

/**
 * @Date 2017年1月17日上午10:35:21 
 *
 */
public class GeneratorDaoImpl extends BaseDaoImpl implements GeneratorDao {

	@Override
	public String getNextSonCode(String parentCode, Class<?> tableClass,
			String codeColum, int codeLen) throws Exception {
		/** 判断父节点是否为null */
		parentCode =  parentCode==null?"":parentCode;
		StringBuilder hql = new StringBuilder();
		/** 1.查询出当前父节点下的最大儿子节点编号 */
		hql.append("select Max(m.").append(codeColum).append(") ");
		hql.append("from ").append(tableClass.getSimpleName()).append(" m");
		/** 2.条件： 子节点的前几位必须是父节点,子节点的长度是父节点的长度+步长 */
		hql.append(" where m.").append(codeColum).append(" like ? and ");
		hql.append(" length(m.").append(codeColum).append(") = ? ");
		/** 3.查询出最大儿子节点编号 */
		Object[] params = new Object[2];
		params[0] = parentCode+"%";
		params[1] = parentCode.length()+codeLen;
		/**
		 * */
		String maxSonCode = this.findUniqueEntity(hql.toString(), params);
		System.out.println("当前最大儿子节点编号是: maxSonCode---->"+maxSonCode);
		String nextSonCode = ""; // 保存最终的下一个儿子节点编号 
		/** 4.判断最大儿子节点编号是否存在 ,因为极有可能父节点此时一个子节点都没有 */
		if(StringUtils.isEmpty(maxSonCode)){
			/** 儿子节点编号不存在 */
			String preSuffix = "" ; // 0 需要拼接多少个0
			for(int i = 0 ; i < codeLen - 1; i++ ){
				preSuffix+="0";
			}
			nextSonCode = parentCode+preSuffix+1;
		}else{
			/** 儿子节点编号存在 --> 000100010005  */
			/** 截取出当前儿子节点编号的步长出来 ---> 9  */
			String currentMaxSonCode = maxSonCode.substring(parentCode.length());
			/** 得到儿子节点步长编号的整形形式  5 */
			int maxSonCodeInt = Integer.valueOf(currentMaxSonCode);
			maxSonCodeInt++; //16
			/** 判断编号是否越界了 9999+1 = 10000 */
			if((maxSonCodeInt+"").length() > codeLen){
				throw new OaException("编号越界了！");
			}else{
				/** 没有越界 */
				String preSuffix = "" ; // 0 需要拼接多少个0
				for(int i = 0 ; i< codeLen-(maxSonCodeInt+"").length() ; i++){
					preSuffix+="0";
				}
				
				nextSonCode = parentCode+preSuffix+maxSonCodeInt;
			}
		}
		return nextSonCode;
	}

}
